package cn.lg.soar.system.biz.modules.message.service;

import cn.lg.soar.common.model.PageQuery;
import cn.lg.soar.common.model.PageResult;
import cn.lg.soar.database.base.service.IBaseService;
import cn.lg.soar.database.query.QueryParams;
import cn.lg.soar.system.biz.modules.message.entity.Notice;
import cn.lg.soar.system.biz.modules.message.model.NoticeDetailVo;
import cn.lg.soar.system.biz.modules.message.model.NoticeVo;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;

/**
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface INoticeService extends IBaseService<Notice> {

    /**
     * 广播消息
     * @param notice
     */
    void broadcast(Notice notice);

    /**
     * 通知指定用户
     * @param notice
     * @param userIds
     */
    void toUser(Notice notice, List<Long> userIds);

    /**
     * 通知详情（消息管理）
     * @param id
     * @return
     */
    NoticeDetailVo detail(Long id);

    /**
     * 获取未读消息数量
     * @param userId
     * @param webCount 前端已知数量
     * @return
     */
    long unreadNoticeCount(Long userId);

    /**
     * 获取用户未读通知列表
     * @param userId
     * @param page
     * @return
     */
    IPage<NoticeVo> unreadNoticeList(Long userId, IPage<NoticeVo> page);

    /**
     * 获取未读消息（轮询使用）
     * @param userId
     * @param webCount 前端已知数量
     * @return
     */
    PageResult<NoticeVo> unreadNotice(Long userId, Long webCount);

    /**
     * 用户消息
     * @param userId
     * @param pageQuery
     * @param params
     * @return
     */
    PageResult<NoticeVo> userNoticeList(Long userId, PageQuery pageQuery, QueryParams params);

    /**
     * 删除用户消息
     * @param userId
     * @param ids
     */
    void removeUserNotice(Long userId, List<Long> ids);

    /**
     * 更新为已读状态
     */
    void updateRead(Long userId, Long noticeId);

    /**
     * 更新为已读状态
     * @param noticeIds
     * @param userId
     */
    default void updateRead(Long userId, List<Long> noticeIds) {
        for (Long noticeId : noticeIds) {
            updateRead(userId, noticeId);
        }
    }

    /**
     * 读取消息
     * @param id
     * @return
     */
    Notice read(Long id);

}
